import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
import { COLLECTIONS, INDEXES, VALIDATORS } from '../../../config/database.config';

/**
 * @file GPS日志实体
 * @description 定义GPS日志数据的结构，用于存储在MongoDB中
 * @author Assistant
 * @date 2024-02-05
 */

@Schema({
  timestamps: true,
  versionKey: false,
  collection: COLLECTIONS.GPS_LOGS,
  expireAfterSeconds: INDEXES.TTL_DAYS * 24 * 60 * 60
})
export class GpsLog {
  /**
   * 设备的唯一标识符
   */
  @Prop({ 
    required: true, 
    index: { 
      unique: false,
      sparse: true 
    }
  })
  deviceId: string;

  /**
   * 日志记录的时间戳
   */
  @Prop({ 
    required: true, 
    type: Date,
    index: true 
  })
  timestamp: Date;

  /**
   * GPS位置的经纬度
   */
  @Prop({
    type: {
      lng: { 
        type: Number, 
        required: true,
        min: VALIDATORS.LONGITUDE.min,
        max: VALIDATORS.LONGITUDE.max
      },
      lat: { 
        type: Number, 
        required: true,
        min: VALIDATORS.LATITUDE.min,
        max: VALIDATORS.LATITUDE.max
      }
    },
    _id: false,
    index: '2dsphere'
  })
  position: {
    lng: number;
    lat: number;
  };

  /**
   * 原始位置的经纬度，可选字段
   */
  @Prop({
    type: {
      lng: {
        type: Number,
        min: VALIDATORS.LONGITUDE.min,
        max: VALIDATORS.LONGITUDE.max
      },
      lat: {
        type: Number,
        min: VALIDATORS.LATITUDE.min,
        max: VALIDATORS.LATITUDE.max
      }
    },
    _id: false,
  })
  original?: {
    lng: number;
    lat: number;
  };

  /**
   * 位置来源（如 GPS 或 LBS）
   */
  @Prop({ type: String, enum: ['gps', 'lbs'] })
  positionSource?: string;

  /**
   * 是否定位成功
   */
  @Prop({ default: false })
  isFix: boolean;

  /**
   * 设备的电池电压
   */
  @Prop()
  battery?: number;

  /**
   * 信号强度
   */
  @Prop()
  signal?: number;

  /**
   * 设备的速度
   */
  @Prop({ 
    min: VALIDATORS.SPEED.min,
    max: VALIDATORS.SPEED.max,
    required: true 
  })
  speed: number;
}

export type GpsLogDocument = GpsLog & Document;

// 创建GPS日志模型
export const GpsLogSchema = SchemaFactory.createForClass(GpsLog);

// 创建复合索引
GpsLogSchema.index({ deviceId: 1, timestamp: -1 }, { 
  background: true,
  sparse: true 
});

// 添加TTL索引
GpsLogSchema.index({ createdAt: 1 }, { 
  expireAfterSeconds: INDEXES.TTL_DAYS * 24 * 60 * 60,
  background: true
}); 